#pragma once
#include <cstdint>

#include "key.hpp"
#include "Enigma.impl.hpp"


namespace Enigma {
    template<std::uint16_t charset_size, std::uint8_t rotors_number>
    using Encryptor = clay::Enigma<charset_size, rotors_number>;

    template<std::uint16_t charset_size, std::uint8_t rotors_number>
    using Decryptor = clay::Enigma<charset_size, rotors_number>;

    template<std::uint8_t rotors_number>
    using Key = clay::EnigmaKey<rotors_number>;

    // using clay::GenerateKey;
    template<std::uint16_t charset_size, std::uint8_t rotors_number>
    Key<rotors_number> GenerateKey(const std::uint64_t seed, const std::uint16_t pair_number = (charset_size / 2))
    {
        return clay::GenerateKey<charset_size, rotors_number>(seed, pair_number);
    }
}
